www.gusucode.com > ROCBOSS微社区-微信论坛程序 v2.1PHP源码程序 > ROCBOSS微社区-微信论坛程序 v2.1/ROCBOSS_v2.1.0/ROCBOSS_v2.1.0/app/template/rocboss/assets/js/ImageUpload.js

    var EXIF = function() {
        function x(a, e) {
            e || a.match(/^data\:([^\;]+)\;base64,/mi);
            a = a.replace(/^data\:([^\;]+)\;base64,/gmi, "");
            for (var b = atob(a), f = b.length, d = new ArrayBuffer(f), c = new Uint8Array(d), k = 0; k < f; k++) c[k] = b.charCodeAt(k);
            return d
        }
        function y(a, e) {
            var b = new XMLHttpRequest;
            b.open("GET", a, !0);
            b.responseType = "blob";
            b.onload = function(a) {
                200 != this.status && 0 !== this.status || e(this.response)
            };
            b.send()
        }
        function z(a, e) {
            function b(b) {
                var c;
                a: if (c = new DataView(b), 255 != c.getUint8(0) || 216 != c.getUint8(1)) c = !1;
                else {
                    for (var d = 2, f = b.byteLength, l; d < f;) {
                        if (255 != c.getUint8(d)) {
                            c = !1;
                            break a
                        }
                        l = c.getUint8(d + 1);
                        if (225 == l) {
                            c = A(c, d + 4, c.getUint16(d + 2) - 2);
                            break a
                        } else d += 2 + c.getUint16(d + 2)
                    }
                    c = void 0
                }
                a: if (d = new DataView(b), 255 != d.getUint8(0) || 216 != d.getUint8(1)) b = !1;
                else {
                    f = 2;
                    for (l = b.byteLength; f < l;) {
                        var g = d,
                            h = f;
                        if (56 === g.getUint8(h) && 66 === g.getUint8(h + 1) && 73 === g.getUint8(h + 2) && 77 === g.getUint8(h + 3) && 4 === g.getUint8(h + 4) && 4 === g.getUint8(h + 5)) {
                            g = d.getUint8(f + 7);
                            0 !== g % 2 && (g += 1);
                            0 === g && (g = 4);
                            l = f + 8 + g;
                            f = d.getUint16(f + 6 + g);
                            d = l;
                            b = new DataView(b);
                            l = {};
                            for (var p = void 0, h = p = h = void 0, g = d; g < d + f;) 28 === b.getUint8(g) && 2 === b.getUint8(g + 1) && (h = b.getUint8(g + 2), h in t && (p = b.getInt16(g + 3), h = t[h], p = q(b, g + 5, p), l.hasOwnProperty(h) ? l[h] instanceof Array ? l[h].push(p) : l[h] = [l[h], p] : l[h] = p)), g++;
                            b = l;
                            break a
                        }
                        f++
                    }
                    b = void 0
                }
                a.exifdata = c || {};
                a.iptcdata = b || {};
                e && e.call(a)
            }
            if (a instanceof Image || a instanceof HTMLImageElement) if (/^data\:/i.test(a.src)) {
                var f = x(a.src);
                b(f)
            } else if (/^blob\:/i.test(a.src)) {
                var d = new FileReader;
                d.onload = function(a) {
                    b(a.target.result)
                };
                y(a.src, function(a) {
                    d.readAsArrayBuffer(a)
                })
            } else {
                var c = new XMLHttpRequest;
                c.onload = function() {
                    if ("200" == c.status) b(c.response);
                    else throw "Could not load image";
                    c = null
                };
                c.open("GET", a.src, !0);
                c.responseType = "arraybuffer";
                c.send(null)
            } else window.FileReader && (a instanceof window.Blob || a instanceof window.File) && (d = new FileReader, d.onload = function(a) {
                debug && console.log("Got file of length " + a.target.result.byteLength);
                b(a.target.result)
            }, d.readAsArrayBuffer(a))
        }
        function u(a, e, b, f, d) {
            var c = a.getUint16(b, !d),
                k = {},
                m, q, r;
            for (r = 0; r < c; r++) m = b + 12 * r + 2, q = f[a.getUint16(m, !d)], k[q] = B(a, m, e, b, d);
            return k
        }
        function B(a, e, b, f, d) {
            var c = a.getUint16(e + 2, !d);
            f = a.getUint32(e + 4, !d);
            b = a.getUint32(e + 8, !d) + b;
            var k, m;
            switch (c) {
            case 1:
            case 7:
                if (1 == f) return a.getUint8(e + 8, !d);
                b = 4 < f ? b : e + 8;
                e = [];
                for (c = 0; c < f; c++) e[c] = a.getUint8(b + c);
                return e;
            case 2:
                return q(a, 4 < f ? b : e + 8, f - 1);
            case 3:
                if (1 == f) return a.getUint16(e + 8, !d);
                b = 2 < f ? b : e + 8;
                e = [];
                for (c = 0; c < f; c++) e[c] = a.getUint16(b + 2 * c, !d);
                return e;
            case 4:
                if (1 == f) return a.getUint32(e + 8, !d);
                e = [];
                for (c = 0; c < f; c++) e[c] = a.getUint32(b + 4 * c, !d);
                return e;
            case 5:
                if (1 == f) return k = a.getUint32(b, !d), m = a.getUint32(b + 4, !d), a = new Number(k / m), a.numerator = k, a.denominator = m, a;
                e = [];
                for (c = 0; c < f; c++) k = a.getUint32(b + 8 * c, !d), m = a.getUint32(b + 4 + 8 * c, !d), e[c] = new Number(k / m), e[c].numerator = k, e[c].denominator = m;
                return e;
            case 9:
                if (1 == f) return a.getInt32(e + 8, !d);
                e = [];
                for (c = 0; c < f; c++) e[c] = a.getInt32(b + 4 * c, !d);
                return e;
            case 10:
                if (1 == f) return a.getInt32(b, !d) / a.getInt32(b + 4, !d);
                e = [];
                for (c = 0; c < f; c++) e[c] = a.getInt32(b + 8 * c, !d) / a.getInt32(b + 4 + 8 * c, !d);
                return e
            }
        }
        function q(a, e, b) {
            var f = "";
            for (n = e; n < e + b; n++) f += String.fromCharCode(a.getUint8(n));
            return f
        }
        function A(a, e) {
            if ("Exif" != q(a, e, 4)) return !1;
            var b, f, d, c = e + 6;
            if (18761 == a.getUint16(c)) b = !1;
            else if (19789 == a.getUint16(c)) b = !0;
            else return !1;
            if (42 != a.getUint16(c + 2, !b)) return !1;
            f = a.getUint32(c + 4, !b);
            if (8 > f) return !1;
            f = u(a, c, c + f, v, b);
            if (f.ExifIFDPointer) for (d in b = u(a, c, c + f.ExifIFDPointer, w, b), b) {
                switch (d) {
                case "ExifVersion":
                case "FlashpixVersion":
                    b[d] = String.fromCharCode(b[d][0], b[d][1], b[d][2], b[d][3])
                }
                f[d] = b[d]
            }
            return f
        }
        var w = {
            36864: "ExifVersion",
            40960: "FlashpixVersion",
            40961: "ColorSpace",
            40962: "PixelXDimension",
            40963: "PixelYDimension",
            37122: "CompressedBitsPerPixel",
            41492: "SubjectLocation"
        },
            v = {
                256: "ImageWidth",
                257: "ImageHeight",
                34665: "ExifIFDPointer",
                258: "BitsPerSample",
                259: "Compression",
                262: "PhotometricInterpretation",
                274: "Orientation",
                277: "SamplesPerPixel",
                284: "PlanarConfiguration",
                530: "YCbCrSubSampling",
                531: "YCbCrPositioning",
                282: "XResolution",
                283: "YResolution",
                296: "ResolutionUnit",
                273: "StripOffsets",
                278: "RowsPerStrip",
                279: "StripByteCounts",
                513: "JPEGInterchangeFormat",
                514: "JPEGInterchangeFormatLength",
                301: "TransferFunction",
                318: "WhitePoint",
                319: "PrimaryChromaticities",
                529: "YCbCrCoefficients",
                532: "ReferenceBlackWhite",
                306: "DateTime",
                270: "ImageDescription",
                271: "Make",
                272: "Model",
                305: "Software",
                315: "Artist",
                33432: "Copyright"
            },
            t = {
                120: "caption",
                110: "credit",
                25: "keywords",
                55: "dateCreated",
                80: "byline",
                85: "bylineTitle",
                122: "captionWriter",
                105: "headline",
                116: "copyright",
                15: "category"
            };
        return {
            getTag: function(a, e) {
                if (a.exifdata) return a.exifdata[e]
            },
            getAllTags: function(a) {
                if (!a.exifdata) return {};
                var e;
                a = a.exifdata;
                var b = {};
                for (e in a) a.hasOwnProperty(e) && (b[e] = a[e]);
                return b
            },
            getData: function(a, e) {
                if ((a instanceof Image || a instanceof HTMLImageElement) && !a.complete) return !1;
                a.exifdata ? e && e.call(a) : z(a, e);
                return !0
            },
            Tags: w,
            TiffTags: v
        }
    }();
(function($) {
    $.fn.ImageUpload = function(option) {
        $(this).on('change', function() {
            var self = this,
                img = new Image(),
                reader = new FileReader(),
                canvas = document.createElement('canvas');
            if (canvas.getContext) {
                var ctx = canvas.getContext('2d')
            } else {
                alert("您的浏览器不支持HTML5!");
                self.value = ""
            }
            if (this.files[0].type == 'image/gif') {
                var IsGIF = true
            } else {
                var IsGIF = false
            }
            option.before();
            reader.onload = function(evt) {
                var srcString = evt.target.result;
                img.src = srcString.substring(5, 10) != "image" ? srcString.replace(/(.{5})/, "$1image/jpeg;") : srcString;
                if (IsGIF) {
                    option.after(this.result);
                    dataTrans = this.result
                } else {
                    option.after(img.src)
                }
                img.onload = function() {
                    if (!IsGIF) {
                        var w = img.width,
                            h = img.height,
                            afw = option.setWidth || 500,
                            afh = afw * h / w;
                        var orientation = 1;
                        EXIF.getData(img, function() {
                            orientation = parseInt(EXIF.getTag(img, "Orientation"));
                            orientation = orientation ? orientation : 1
                        });
                        if (w < 100 || h < 100) return false;
                        if (orientation <= 4) {
                            $(canvas).attr({
                                width: afw,
                                height: afh
                            });
                            if (orientation == 3 || orientation == 4) {
                                ctx.translate(afw, afh);
                                ctx.rotate(180 * Math.PI / 180)
                            }
                        } else {
                            $(canvas).attr({
                                width: afh,
                                height: afw
                            });
                            if (orientation == 5 || orientation == 6) {
                                ctx.translate(afh, 0);
                                ctx.rotate(90 * Math.PI / 180)
                            } else if (orientation == 7 || orientation == 8) {
                                ctx.translate(0, afw);
                                ctx.rotate(270 * Math.PI / 180)
                            }
                        }
                        if (navigator.userAgent.match(/iphone/i)) {
                            drawImageIOSFix(ctx, img, 0, 0, w, h, 0, 0, afw, afh)
                        } else {
                            ctx.drawImage(img, 0, 0, afw, afh)
                        }
                        self.value = "";
                        dataTrans = canvas.toDataURL('image/jpeg')
                    }
                    $.ajax({
                        xhr: function() {
                            var xhrobj = $.ajaxSettings.xhr();
                            if (xhrobj.upload) {
                                xhrobj.upload.addEventListener('progress', function(event) {
                                    var percent = 0;
                                    var position = event.loaded || event.position;
                                    var total = event.total || e.totalSize;
                                    if (event.lengthComputable) {
                                        percent = Math.ceil(position / total * 100)
                                    }
                                    option.progress(percent)
                                }, false)
                            }
                            return xhrobj
                        },
                        url: option.url,
                        data: {
                            'base64': dataTrans
                        },
                        type: 'POST',
                        dataType: 'json',
                        success: function(result) {
                            option.success(result)
                        }
                    })
                }
            }
            reader.readAsDataURL(this.files[0]);
            if (this.outerHTML) {
                this.outerHTML = this.outerHTML;
            } else {
                this.value = '';
            }
        });

        function detectVerticalSquash(img) {
            var iw = img.naturalWidth,
                ih = img.naturalHeight;
            var canvas = document.createElement('canvas');
            canvas.width = 1;
            canvas.height = ih;
            var ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0);
            var data = ctx.getImageData(0, 0, 1, ih).data;
            var sy = 0;
            var ey = ih;
            var py = ih;
            while (py > sy) {
                var alpha = data[(py - 1) * 4 + 3];
                if (alpha === 0) {
                    ey = py
                } else {
                    sy = py
                }
                py = (ey + sy) >> 1
            }
            var ratio = (py / ih);
            return (ratio === 0) ? 1 : ratio
        }
        function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
            var vertSquashRatio = detectVerticalSquash(img);
            ctx.drawImage(img, sx * vertSquashRatio, sy * vertSquashRatio, sw * vertSquashRatio, sh * vertSquashRatio, dx, dy, dw, dh)
        }
    }
})(jQuery);